14439
19891
Kürzlich habe ich einen Teil meines JavaScript-Codes über Crockfords JSLint ausgeführt und dabei den folgenden Fehler ausgegeben:
Problem in Zeile 1, Zeichen 1: Fehlende Anweisung "use strict".
Beim Durchsuchen wurde mir klar, dass einige Leute "use strict" hinzufügen. in ihren JavaScript-Code. Nachdem ich die Anweisung hinzugefügt hatte, wurde der Fehler nicht mehr angezeigt. Leider hat Google nicht viel von der Geschichte hinter dieser Zeichenfolgenanweisung enthüllt. Natürlich muss es etwas damit zu tun haben, wie das JavaScript vom Browser interpretiert wird, aber ich habe keine Ahnung, wie sich das auswirken würde.
Also, was ist "streng verwenden"; Alles über, was bedeutet es und ist es immer noch relevant?
Reagiert einer der aktuellen Browser auf "use strict"? Zeichenfolge oder ist es für die zukünftige Verwendung? 
Dieser Artikel über den strengen Javascript-Modus könnte Sie interessieren: John Resig - ECMAScript 5 Strict Mode, JSON und mehr
Um einige interessante Teile zu zitieren:
Der strikte Modus ist eine neue Funktion in ECMAScript 5, mit der Sie ein Programm oder eine Funktion in einen "strengen" Betriebskontext stellen können. Dieser strenge Kontext verhindert, dass bestimmte Aktionen ausgeführt werden, und löst weitere Ausnahmen aus.
Und:
Der strenge Modus hilft auf verschiedene Weise:
Es fängt einige gängige Codierungsfehler ein und löst Ausnahmen aus.
Es verhindert oder löst Fehler aus, wenn relativ "unsichere" Aktionen ausgeführt werden (z. B. Zugriff auf das globale Objekt).
Es deaktiviert Funktionen, die verwirrend oder schlecht durchdacht sind.
Beachten Sie auch, dass Sie den "strengen Modus" auf die gesamte Datei anwenden können ... Oder Sie können ihn nur für eine bestimmte Funktion verwenden (zitiert immer noch aus John Resigs Artikel):
// Nicht strenger Code ...
(Funktion(){
"benutze streng";
// Definiere deine Bibliothek streng ...
}) ();
// Nicht strenger Code ...
Was hilfreich sein kann, wenn Sie alten und neuen Code mischen müssen ;-)
Ich nehme an, es ist ein bisschen wie das "use strict", das Sie in Perl verwenden können (daher der Name?): Es hilft Ihnen, weniger Fehler zu machen, indem es mehr Dinge erkennt, die zu Brüchen führen können.
Der strikte Modus wird jetzt von allen gängigen Browsern unterstützt.
In nativen ECMAScript-Modulen (mit Import- und Exportanweisungen) und ES6-Klassen ist der strikte Modus immer aktiviert und kann nicht deaktiviert werden.
|
Es ist eine neue Funktion von ECMAScript 5. John Resig hat eine schöne Zusammenfassung davon geschrieben.
Es ist nur eine Zeichenfolge, die Sie in Ihre JavaScript-Dateien einfügen (entweder oben in Ihrer Datei oder innerhalb einer Funktion) und die folgendermaßen aussieht:
"benutze streng";
Das Einfügen in Ihren Code sollte bei aktuellen Browsern keine Probleme verursachen, da es sich nur um eine Zeichenfolge handelt. Es kann in Zukunft Probleme mit Ihrem Code verursachen, wenn Ihr Code das Pragma verletzt. Wenn Sie beispielsweise derzeit foo = "bar" haben, ohne zuerst foo zu definieren, schlägt Ihr Code fehl ... was meiner Meinung nach eine gute Sache ist.
|
Die Aussage "use strict"; weist den Browser an, den Strict-Modus zu verwenden, bei dem es sich um einen reduzierten und sichereren Funktionsumfang von JavaScript handelt.
Liste der Funktionen (nicht vollständig)
Verbietet globale Variablen. (Fängt fehlende var-Deklarationen und Tippfehler in Variablennamen ab)
Stille fehlgeschlagene Zuweisungen führen im strengen Modus zu Fehlern (Zuweisung von NaN = 5;)
Versuche, nicht löschbare Eigenschaften zu löschen, werden ausgelöst (Object.prototype löschen).
Erfordert, dass alle Eigenschaftsnamen in einem Objektliteral eindeutig sind (var x = {x1: "1", x1: "2"})
Funktionsparameternamen müssen eindeutig sein (Funktionssumme (x, x) {...})
Verbietet die oktale Syntax (var x = 023; einige Entwickler gehen fälschlicherweise davon aus, dass eine vorhergehende Null nichts zur Änderung der Zahl beiträgt.)
Verbietet das with-Schlüsselwort
eval im strengen Modus führt keine neuen Variablen ein
Verbietet das Löschen von einfachen Namen (x löschen;)
Verbietet das Binden oder Zuweisen der Namen eval und Argumente in irgendeiner Form
Im strengen Modus werden die Eigenschaften des Argumentobjekts nicht mit den formalen Parametern verknüpft. (d. h. in Funktionssumme (a, b) {Argumente [0] + b zurückgeben;} Dies funktioniert, weil Argumente [0] an a usw. gebunden sind.)
Argumente.Callee wird nicht unterstützt
[Ref: Strenger Modus, Mozilla Developer Network]
|
Wenn die Leute sich Sorgen über die Verwendung von strict machen, lohnt es sich möglicherweise, diesen Artikel zu lesen:
ECMAScript 5 'Strenger Modus' Unterstützung in Browsern. Was bedeutet das? NovoGeek.com - Krishnas Weblog
Es geht um Browserunterstützung, aber was noch wichtiger ist, wie man sicher damit umgeht:
Funktion isStrictMode () {
kehre zurück!
}}
/ *
gibt false zurück, da 'this' sich auf das globale Objekt und bezieht
'! this' wird falsch
* /
Funktion isStrictMode () {
"benutze streng";
kehre zurück!
}}
/ *
gibt true zurück, da im strengen Modus das Schlüsselwort 'this'
bezieht sich im Gegensatz zu herkömmlichem JS nicht auf ein globales Objekt.
Also hier ist 'dies' 'undefiniert' und '! Dies' wird wahr.
* /
|
Ein Wort der Vorsicht, alle hart aufgeladenen Programmierer: Die Anwendung von "use strict" auf vorhandenen Code kann gefährlich sein! Bei diesem Ding handelt es sich nicht um einen Aufkleber zum Wohlfühlen und zum glücklichen Gesicht, den Sie auf den Code klopfen können, um ihn "besser" zu machen. Mit dem Pragma "strikt verwenden" wirft der Browser plötzlich Ausnahmen an zufälligen Stellen, die er noch nie zuvor ausgelöst hat, nur weil Sie an dieser Stelle etwas tun, das standardmäßiges / loses JavaScript gerne zulässt, aber striktes JavaScript verabscheut! Möglicherweise haben Sie Verstöße gegen die Strenge, die sich in selten verwendeten Aufrufen in Ihrem Code verstecken und nur dann eine Ausnahme auslösen, wenn sie schließlich ausgeführt werden - beispielsweise in der Produktionsumgebung, die Ihre zahlenden Kunden verwenden!
Wenn Sie den Sprung wagen wollen, ist es eine gute Idee, "use strict" neben umfassenden Unit-Tests und einer streng konfigurierten JSHint-Build-Aufgabe anzuwenden, die Ihnen die Gewissheit gibt, dass keine dunkle Ecke Ihres Moduls explodiert schrecklich, nur weil du den Strict Mode aktiviert hast. Oder, hey, hier ist eine andere Option: Fügen Sie einfach keinem Ihrer Legacy-Codes "use strict" hinzu, es ist wahrscheinlich auf diese Weise sicherer, ehrlich. Fügen Sie auf keinen Fall "use strict" zu Modulen hinzu, die Sie nicht besitzen oder besitzenpflegen, wie Module von Drittanbietern.
Ich denke, obwohl es ein tödliches Tier im Käfig ist, kann "streng verwenden" gutes Zeug sein, aber man muss es richtig machen. Die beste Zeit, um streng zu werden, ist, wenn Ihr Projekt auf der grünen Wiese steht und Sie bei Null anfangen. Konfigurieren Sie JSHint / JSLint mit allen Warnungen und Optionen, die so eng wie möglich sind, erhalten Sie ein gutes Build / Test / Assert-System wie Grunt + Karma + Chai und markieren Sie dann alle Ihre neuen Module als " benutze strenge ". Seien Sie bereit, viele kleine Fehler und Warnungen zu beheben. Stellen Sie sicher, dass jeder die Schwerkraft versteht, indem Sie den Build auf FAIL konfigurieren, wenn JSHint / JSLint Verstöße verursacht.
Mein Projekt war kein Greenfield-Projekt, als ich "use strict" übernahm. Infolgedessen ist meine IDE voller roter Markierungen, da ich bei der Hälfte meiner Module keine "strikte Verwendung" habe, und JSHint beschwert sich darüber. Es erinnert mich daran, was ich in Zukunft tun sollte. Mein Ziel ist es, aufgrund all meiner fehlenden "use strict" -Aussagen frei von roten Markierungen zu sein, aber das ist jetzt Jahre entfernt.
|
Verwenden von 'use strict'; macht Ihren Code nicht plötzlich besser.
Der strikte JavaScript-Modus ist eine Funktion in ECMAScript 5. Sie können den strengen Modus aktivieren, indem Sie dies oben in Ihrem Skript / Ihrer Funktion deklarieren.
'use strict';
Wenn eine JavaScript-Engine diese Anweisung sieht, beginnt sie, den Code in einem speziellen Modus zu interpretieren. In diesem Modus werden Fehler ausgelöst, wenn bestimmte Codierungspraktiken erkannt werden, die potenzielle Fehler darstellen können (was die Begründung für den strengen Modus ist).
Betrachten Sie dieses Beispiel:
var a = 365;
var b = 030;
In ihrer Besessenheit, die numerischen Literale auszurichten, hat der Entwickler die Variable b versehentlich mit einem oktalen Literal initialisiert. Im nicht strengen Modus wird dies als numerisches Literal mit dem Wert 24 (in Basis 10) interpretiert. Der strikte Modus löst jedoch einen Fehler aus.
Eine nicht vollständige Liste der Spezialitäten im strengen Modus finden Sie in dieser Antwort.
Wo soll ich 'use strict' verwenden?
In meiner neuen JavaScript-Anwendung: Absolut! Der strikte Modus kann als Whistleblower verwendet werden, wenn Sie etwas Dummes mit Ihrem Code tun.
In meinem vorhandenen JavaScript-Code: Wahrscheinlich nicht! Wenn Ihr vorhandener JavaScript-Code Anweisungen enthält, die im strengen Modus verboten sind, wird die Anwendung einfach unterbrochen. Wenn Sie einen strengen Modus wünschen, sollten Sie bereit sein, Ihren vorhandenen Code zu debuggen und zu korrigieren. Aus diesem Grund verwenden Sie 'use strict'. macht Ihren Code nicht plötzlich besser.
Wie verwende ich den strengen Modus?
Fügen Sie ein 'use strict' ein. Aussage über Ihrem Skript:
// Datei: myscript.js
'use strict';
var a = 2;
....
Beachten Sie, dass alles in der Datei myscript.js im strengen Modus interpretiert wird.
Oder fügen Sie ein 'use strict' ein. Aussage über Ihrem Funktionskörper:
Funktion doSomething () {
'use strict';
...
}}
Alles im lexikalischen Funktionsumfang doSomething wird im strengen Modus interpretiert. Das Wort lexikalischer Geltungsbereich ist hier wichtig. Wenn Ihr strenger Code beispielsweise eine Funktion einer Bibliothek aufruft, die nicht streng ist, wird nur Ihr Code im strengen Modus ausgeführt und nicht die aufgerufene Funktion. Siehe diese Antwort für eine bessere Erklärung.
Welche Dinge sind im strengen Modus verboten?
Ich habe einen schönen Artikel gefunden, der einige Dinge beschreibt, die im strengen Modus verboten sind (beachten Sie, dass dies keine exklusive Liste ist):
Umfang
In der Vergangenheit war JavaScript verwirrt darüber, wie es funktioniert
sind Umfang. Manchmal scheinen sie statisch zu sein, aber einige
Durch Features verhalten sie sich so, als wären sie dynamisch. Das ist
verwirrend, was das Lesen und Verstehen von Programmen erschwert.
Missverständnisse verursachen Fehler. Es ist auch ein Problem für die Leistung.
Statisches Scoping würde eine variable Bindung beim Kompilieren ermöglichen
Zeit, aber die Anforderung für den dynamischen Umfang bedeutet, dass die Bindung sein muss
auf die Laufzeit verschoben, was mit einer erheblichen Leistung verbunden ist
Elfmeter.
Im strengen Modus muss die gesamte Variablenbindung statisch erfolgen.
Das bedeutet, dass die Funktionen, die zuvor eine dynamische Bindung erforderten
muss beseitigt oder geändert werden. Insbesondere ist die with-Anweisung
beseitigt, und die Fähigkeit der Bewertungsfunktion, die zu manipulieren
Die Umgebung des Anrufers ist stark eingeschränkt.
Einer der Vorteile von striktem Code ist, dass Tools wie YUI Compressor
kann einen besseren Job bei der Verarbeitung machen.
Implizierte globale Variablen
JavaScript hat globale Variablen impliziert. Wenn
Sie deklarieren eine Variable nicht explizit, sondern eine globale Variable
implizit für Sie deklariert. Dies erleichtert die Programmierung für
Anfänger, weil sie einen Teil ihrer grundlegenden Haushaltsführung vernachlässigen können
Hausarbeit. Aber es macht die Verwaltung größerer Programme viel mehr
schwierig und es verschlechtert die Zuverlässigkeit erheblich. Also streng
Im Modus werden implizite globale Variablen nicht mehr erstellt. Du solltest
Deklarieren Sie explizit alle Ihre Variablen.
Globale Leckage
Es gibt eine Reihe von Situationen, die dies verursachen können
an das globale Objekt gebunden sein. Zum Beispiel, wenn Sie es vergessen
Geben Sie beim Aufrufen eines Konstruktors das neue Präfix anFunktion, die
Dies wird unerwartet an das globale Objekt gebunden
Anstatt ein neues Objekt zu initialisieren, wird es stillschweigend angezeigt
Manipulationen an globalen Variablen. In diesen Situationen wird der strikte Modus
Binden Sie dies stattdessen an undefined, was den Konstruktor dazu veranlasst
Wirf stattdessen eine Ausnahme aus, damit der Fehler häufig erkannt wird
früher.
Lauter Fehler
JavaScript hatte immer schreibgeschützte Eigenschaften, aber Sie
Sie konnten sie erst mit Object.createProperty von ES5 selbst erstellen
Funktion enthüllte diese Fähigkeit. Wenn Sie versucht haben, einen Wert zuzuweisen
Bei einer schreibgeschützten Eigenschaft würde dies stillschweigend fehlschlagen. Die Aufgabe würde
Ändern Sie den Wert der Eigenschaft nicht, aber Ihr Programm würde wie folgt fortfahren
obwohl es hatte. Dies ist ein Integritätsrisiko, das dazu führen kann, dass Programme dies tun
in einen inkonsistenten Zustand gehen. Im strengen Modus wird versucht, a zu ändern
Die schreibgeschützte Eigenschaft löst eine Ausnahme aus.
Oktal
Die oktale (oder Basis 8) Darstellung von Zahlen war extrem
nützlich bei der Programmierung auf Maschinenebene auf Maschinen, deren Wort
Größen waren ein Vielfaches von 3. Sie brauchten Oktal, wenn Sie mit der CDC arbeiten
6600 Mainframe mit einer Wortgröße von 60 Bit. Wenn du lesen könntest
Oktal, Sie könnten ein Wort als 20-stellig betrachten. Zwei Ziffern dargestellt
Der Operationscode und eine Ziffer identifizierten eines von 8 Registern. Während der
Es war ein langsamer Übergang von Maschinencodes zu Hochsprachen
wird als nützlich erachtet, um Oktalformen in Programmiersprachen bereitzustellen.
In C war eine äußerst unglückliche Darstellung der Oktalität
ausgewählt: Führende Null. In C bedeutet 0100 64, nicht 100, und 08 ist ein
Fehler, nicht 8. Noch unglücklicher war dieser Anachronismus
in fast alle modernen Sprachen kopiert, einschließlich JavaScript, wo
Es wird nur zum Erstellen von Fehlern verwendet. Es hat keinen anderen Zweck. Also rein
Im strengen Modus sind Oktalformen nicht mehr zulässig.
Und so weiter
Das Argument Pseudo-Array wird ein bisschen mehr
Array-ähnlich in ES5. Im strengen Modus verliert es seinen Angerufenen und Anrufer
Eigenschaften. Dies ermöglicht es, Ihre Argumente an nicht vertrauenswürdige Personen weiterzugeben
Code, ohne viel vertraulichen Kontext aufzugeben. Auch der
Argumente Eigenschaft von Funktionen wird beseitigt.
Im strengen Modus erzeugen doppelte Schlüssel in einem Funktionsliteral a
Syntax-Fehler. Eine Funktion kann nicht zwei Parameter mit demselben Namen haben.
Eine Funktion kann keine Variable mit demselben Namen wie eine ihrer Funktionen haben
Parameter. Eine Funktion kann ihre eigenen Variablen nicht löschen. Ein Versuch zu
Das Löschen einer nicht konfigurierbaren Eigenschaft löst jetzt eine Ausnahme aus. Primitive
Werte werden nicht implizit umbrochen.
Reservierte Wörter für zukünftige JavaScript-Versionen
ECMAScript 5 fügt eine Liste reservierter Wörter hinzu. Wenn Sie sie als Variablen oder Argumente verwenden, gibt der strikte Modus einen Fehler aus. Die reservierten Wörter sind:
implementiert, Schnittstelle, Vermietung, Paket, privat, geschützt, öffentlich, statisch und Ausbeute
Weiterführende Literatur
Strenger Modus - JavaScript | MDN
Browserunterstützung für den strengen Modus
Übergang in den strengen Modus
|
Ich empfehle jedem Entwickler dringend, jetzt den strengen Modus zu verwenden. Es gibt genügend Browser, die dies unterstützen. Der strikte Modus hilft uns zu Recht vor Fehlern, von denen wir nicht einmal wussten, dass sie in Ihrem Code enthalten sind.
Anscheinend wird es im Anfangsstadium Fehler geben, auf die wir noch nie zuvor gestoßen sind. Um den vollen Nutzen zu erzielen, müssen wir nach dem Wechsel in den strengen Modus ordnungsgemäße Tests durchführen, um sicherzustellen, dass wir alles erfasst haben. Auf jeden Fall werfen wir nicht nur strikte Verwendung in unseren Code und gehen davon aus, dass keine Fehler vorliegen. Die Abwanderung ist also, dass es Zeit ist, diese unglaublich nützliche Sprachfunktion zu verwenden, um besseren Code zu schreiben.
Zum Beispiel,
var person = {
Name: 'xyz',
Position: 'abc',
vollständiger Name: function () {"use strict"; return this.name; }}
};
JSLint ist ein Debugger von Douglas Crockford. Fügen Sie einfach Ihr Skript ein und es wird schnell nach erkennbaren Problemen und Fehlern in Ihrem Code gesucht.
|
Ich möchte eine etwas fundiertere Antwort anbieten, die die anderen Antworten ergänzt. Ich hatte gehofft, die beliebteste Antwort zu bearbeiten, bin aber gescheitert. Ich habe versucht, es so umfassend und vollständig wie möglich zu gestalten.
Weitere Informationen finden Sie in der MDN-Dokumentation.
"use strict" eine in ECMAScript 5 eingeführte Richtlinie.
Richtlinien ähneln Aussagen, unterscheiden sich jedoch.
use strict enthält keine Schlüsselwörter: Die Direktive ist eine einfache Ausdrucksanweisung, die aus einem speziellen Zeichenfolgenliteral (in einfachen oder doppelten Anführungszeichen) besteht. JavaScript-Engines, die ECMAScript 5 nicht implementieren, sehen lediglich eine Ausdrucksanweisung ohne Nebenwirkungen. Es wird erwartet, dass zukünftige Versionen der ECMAScript-Standards die Verwendung als echtes Schlüsselwort einführen. Die Zitate würden dadurch überholt.
use strict kann nur am Anfang eines Skripts oder einer Funktion verwendet werden, d. h. es muss vor jeder anderen (realen) Anweisung stehen. Es muss nicht die erste Anweisung in einem Funktionsskript sein: Es können andere Anweisungsausdrücke vorangestellt werden, die aus Zeichenfolgenliteralen (und JavaScript) bestehenImplementierungen können sie als implementierungsspezifische Richtlinien behandeln. String-Literal-Anweisungen, die auf eine erste echte Anweisung (in einem Skript oder einer Funktion) folgen, sind einfache Ausdrucksanweisungen. Dolmetscher dürfen sie nicht als Richtlinien interpretieren und haben keine Wirkung.
Die Anweisung use strict gibt an, dass der folgende Code (in einem Skript oder einer Funktion) strenger Code ist.
Der Code auf der höchsten Ebene eines Skripts (Code, der nicht in einer Funktion enthalten ist) wird als strenger Code betrachtet, wenn das Skript eine Anweisung zum strikten Verwenden enthält.
Der Inhalt einer Funktion wird als strenger Code betrachtet, wenn die Funktion selbst in einem strengen Code definiert ist oder wenn die Funktion eine Anweisung zum strikten Gebrauch enthält.
Code, der an eine eval () -Methode übergeben wird, wird als strenger Code betrachtet, wenn eval () aus einem strengen Code aufgerufen wurde oder die Anweisung use strict selbst enthält.
Der strikte Modus von ECMAScript 5 ist eine eingeschränkte Teilmenge der JavaScript-Sprache, die relevante Defizite der Sprache beseitigt und eine strengere Fehlerprüfung und höhere Sicherheit bietet. Im Folgenden werden die Unterschiede zwischen dem strengen Modus und dem normalen Modus aufgeführt (von denen die ersten drei besonders wichtig sind):
Sie können die with-Anweisung nicht im strengen Modus verwenden.
Im strengen Modus müssen alle Variablen deklariert werden: Wenn Sie einem Bezeichner einen Wert zuweisen, der nicht als Variable, Funktion, Funktionsparameter, catch-Klausel-Parameter oder Eigenschaft des globalen Objekts deklariert wurde, erhalten Sie einen ReferenceError. Im normalen Modus wird der Bezeichner implizit als globale Variable deklariert (als Eigenschaft des globalen Objekts).
Im strengen Modus hat das Schlüsselwort this den Wert undefined in Funktionen, die als Funktionen (nicht als Methoden) aufgerufen wurden. (Im normalen Modus zeigt dies immer auf das globale Objekt). Dieser Unterschied kann verwendet werden, um zu testen, ob eine Implementierung den strengen Modus unterstützt:
var hasStrictMode = (function () {"use strict"; return this === undefined} ());
Auch wenn eine Funktion mit call () aufgerufen wird oder im strengen Modus angewendet wird, ist dies genau der Wert des ersten Arguments des Aufrufs call () oder apply (). (Im normalen Modus werden null und undefiniert durch das globale Objekt ersetzt und Werte, die keine Objekte sind, werden in Objekte umgewandelt.)
Im strengen Modus erhalten Sie einen TypeError, wenn Sie versuchen, schreibgeschützten Eigenschaften zuzuweisen oder neue Eigenschaften für ein nicht erweiterbares Objekt zu definieren. (Im normalen Modus schlagen beide einfach ohne Fehlermeldung fehl.)
Im strengen Modus können Sie beim Übergeben von Code an eval () keine Variablen oder Funktionen im Bereich des Aufrufers deklarieren oder definieren (wie im normalen Modus). Stattdessen wird ein neuer Bereich für eval () erstellt, und die Variablen und Funktionen befinden sich in diesem Bereich. Dieser Bereich wird zerstört, nachdem eval () die Ausführung beendet hat.
Im strengen Modus enthält das Argument-Objekt einer Funktion eine statische Kopie der Werte, die an diese Funktion übergeben werden. Im normalen Modus hat das Argument-Objekt ein etwas "magisches" Verhalten: Die Elemente des Arrays und die genannten Funktionsparameter verweisen beide auf denselben Wert.
Im strengen Modus erhalten Sie einen SyntaxError, wenn auf den Löschoperator eine nicht qualifizierte Kennung (eine Variable, eine Funktion oder ein Funktionsparameter) folgt. Im normalen Modus würde der Löschausdruck nichts bewirken und wird mit false bewertet.
Im strengen Modus erhalten Sie einen TypeError, wenn Sie versuchen, eine nicht konfigurierbare Eigenschaft zu löschen. (Im normalen Modus schlägt der Versuch einfach fehl und der Löschausdruck wird mit false bewertet.)
Im strengen Modus wird dies als syntaktischer Fehler angesehen, wenn Sie versuchen, mehrere Eigenschaften mit demselben Namen für ein Objektliteral zu definieren. (Im normalen Modus gibt es keinen Fehler.)
Im strengen Modus wird es als syntaktischer Fehler angesehen, wenn eine Funktionsdeklaration mehrere Parameter mit demselben Namen enthält. (Im normalen Modus gibt es keinen Fehler.)
Im strengen Modus sind oktale Literale nicht zulässig (dies sind Literale, die mit 0x beginnen. (Im normalen Modus erlauben einige Implementierungen oktale Literale.)
Im strengen Modus werden die Bezeichner eval und Argumente wie Schlüsselwörter behandelt. Sie können ihren Wert nicht ändern, ihnen keinen Wert zuweisen und sie nicht als Namen für Variablen, Funktionen, Funktionsparameter oder Bezeichner eines catch-Blocks verwenden.
Im strengen Modus gibt es weitere Einschränkungen für die Möglichkeiten, den Aufrufstapel zu untersuchen. Argumente.Caller und Argumente.Callee verursachen einen TypeError in einer Funktion im strengen Modus. Darüber hinaus verursachen einige Aufrufer- und Argumenteigenschaften von Funktionen im strengen Modus einen TypeError, wenn Sie versuchen, sie zu lesen.
|
Meine zwei Cent:
Eines der Ziele des strengen Modus ist es, ein schnelleres Debuggen von Problemen zu ermöglichen. Es hilft den Entwicklern, indem es Ausnahmen auslöst, wenn bestimmte falsche Dinge auftreten, die zu einem stillen und seltsamen Verhalten Ihrer Webseite führen können. In dem Moment, in dem wir use strict verwenden, werden im Code Fehler ausgegeben, die dem Entwickler helfen, diese im Voraus zu beheben.
Einige wichtige Dinge, die ich nach der Verwendung von strict gelernt habe:
Verhindert die Deklaration globaler Variablen:
var tree1Data= {Name: 'Bananenbaum', Alter: 100, Blattzahl: 100000};
Funktionsbaum (typeOfTree) {
var age;
var leafCount;
age = typeOfTree.age;
leafCount = typeOfTree.leafCount;
nameoftree = typeOfTree.name;
};
var tree1 = neuer Baum (tree1Data);
console.log (Fenster);
Dieser Code erstellt nun nameoftree im globalen Bereich, auf den über window.nameoftree zugegriffen werden kann. Wenn wir use strict implementieren, würde der Code einen Fehler auslösen.
Nicht erfasster Referenzfehler: nameoftree ist nicht definiert
Stichprobe
Eliminiert mit Aussage:
with-Anweisungen können nicht mit Tools wie uglify-js minimiert werden. Sie sind auch veraltet und werden aus zukünftigen JavaScript-Versionen entfernt.
Stichprobe
Verhindert Duplikate:
Wenn wir eine doppelte Eigenschaft haben, wird eine Ausnahme ausgelöst
Nicht erfasster SyntaxError: Doppelte Dateneigenschaft im Objektliteral nicht
im strengen Modus erlaubt
"benutze streng";
var tree1Data = {
Name: 'Bananenbaum',
Alter: 100,
leafCount: 100000,
Name: 'Bananenbaum'
};
Es gibt nur wenige mehr, aber ich muss mehr darüber lernen.
|
Wenn Sie einen Browser verwenden, der im letzten Jahr oder so veröffentlicht wurde, unterstützt er höchstwahrscheinlich den JavaScript Strict-Modus. Nur ältere Browser, bevor ECMAScript 5 zum aktuellen Standard wurde, unterstützen dies nicht.
Die Anführungszeichen um den Befehl stellen sicher, dass der Code auch in älteren Browsern funktioniert (obwohl die Dinge, die im strengen Modus einen Syntaxfehler erzeugen, im Allgemeinen nur zu Fehlfunktionen des Skripts in diesen älteren Browsern führen).
|
Wenn Sie "use strict"; hinzufügen, wird in den folgenden Fällen ein SyntaxError ausgelöst, bevor das Skript ausgeführt wird:
Wegbereiter für zukünftige ECMAScript-Versionen mit einem der neu reservierten Schlüsselwörter (in der Vorgängerversion von ECMAScript 6): implementiert, Schnittstelle, Vermietung, Paket, privat, geschützt, öffentlich, statisch und Ausbeute.
Funktion in Blöcken deklarieren
if (a : 3: 15)
bei : 6: 5
Hier löst der Compiler den Referenzfehler aus. Im strengen Modus erlaubt uns der Compiler nicht, die Variable zu verwenden, ohne sie zu deklarieren. So können Speicherlecks verhindert werden. Darüber hinaus können wir optimierten Code schreiben.
|
Der strikte Modus eliminiert Fehler, die im nicht strengen Modus ignoriert würden, wodurch Javascript „sicherer“ wird.
Wird es zu den Best Practices gezählt?
Ja, es wird als Teil der Best Practices bei der Arbeit mit Javascript angesehen, den Strict-Modus einzuschließen. Fügen Sie dazu die folgende Codezeile in Ihre JS-Datei ein.
'use strict';
in Ihrem Code.
Was bedeutet es für Benutzeragenten?
Die Angabe, dass Code im strengen Modus interpretiert werden soll, gibt Benutzeragenten wie Browsern an, dass sie Code buchstäblich als geschrieben behandeln und einen Fehler auslösen sollen, wenn der Code keinen Sinn ergibt.
Beispiel: Beachten Sie, dass Sie in Ihrer .js-Datei den folgenden Code haben:
Szenario 1: [KEIN STRENGER MODUS]
var city = "Chicago"
console.log (Stadt) // Gibt den Namen der Stadt aus, d. h. Chicago
Szenario 2: [KEIN STRENGER MODUS]
city ​​= "Chicago"
console.log (Stadt) // Gibt den Namen der Stadt aus, d. h. Chicago
Warum wird der Variablenname in beiden Fällen gedruckt?
Wenn der strikte Modus nicht aktiviert ist, führen Benutzeragenten häufig eine Reihe von Änderungen an problematischem Code durch, um einen Sinn daraus zu ziehen. Oberflächlich betrachtet kann dies eine feine Sache sein, und in der Tat ermöglicht es die Arbeit außerhalb des strengen Modus, dass Menschen ihre Füße mit JavaScript-Code nass machen, ohne dass alle Details genau festgelegt sind. Als Entwickler möchte ich jedoch keinen Fehler in meinem Code hinterlassen, da ich weiß, dass er später zurückkommen und mich beißen könnte, und ich möchte auch nur guten Code schreiben. Und hier hilft der strenge Modus.
Szenario 3: [STRENGER MODUS]
'use strict';
city ​​= "Chicago"
console.log (city) // Referenzfehler: Zuordnung ist nicht deklarierte Variable city.
Zusätzlicher Tipp: Um die Codequalität im strengen Modus aufrechtzuerhalten, müssen Sie dies nicht immer wieder schreiben, insbesondere wenn Sie mehrere .js-Dateien haben. Sie können diese Regel global in Eslint-Regeln wie folgt durchsetzen:
Dateiname: .eslintrc.js
module.exports = {
env: {
es6: wahr
},
Regeln: {
streng: ['Fehler', 'global'],
},
};
Okay, was wird im strengen Modus verhindert?
Wenn Sie eine Variable ohne Deklaration verwenden, wird im strengen Modus ein Fehler ausgegeben. Dies soll verhindern, dass in Ihrer gesamten Anwendung ungewollt globale Variablen erstellt werden. Das Beispiel mit dem Druck von Chicago deckt dies insbesondere ab.
Das Löschen einer Variablen, einer Funktion oder eines Arguments ist im strengen Modus ein Nein-Nein.
"benutze streng";
Funktion x (p1, p2) {};
x löschen; // Dies wird einen Fehler verursachen
Das Duplizieren eines Parameternamens ist im strengen Modus nicht zulässig.
"benutze streng";
Funktion x (p1, p1) {}; // Dies wird einen Fehler verursachen
Reservierte Wörter in der Javascript-Sprache sind im strengen Modus nicht zulässig. Die Wörter sind implementiert Schnittstelle, lassen, Pakete, privat, geschützt, öffentlich. statisch und Ausbeute
Eine umfassendere Liste finden Sie in der MDN-Dokumentation hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
|
Sehr aktive Frage. Verdiene 10 Reputationen, um diese Frage zu beantworten. Die Reputationsanforderung schützt diese Frage vor Spam und nicht beantworteten Aktivitäten.
Nicht die Antwort, die Sie suchen? Durchsuchen Sie andere Fragen mit dem Tag javascript syntax jslint use-strict oder stellen Sie Ihre eigene Frage.